package day1117;

public class TesVolatile extends Thread{
//private boolean flag=true;
    private volatile boolean flag=true;
private void setFlag(boolean flag){
    this.flag=flag;
}
public void  run(){
    System.out.println("开始run");
    while(flag==true){
        //do something
    }
    System.out.println("结束线程");
}

    /**
     * 关于volatile
     * 使变量在多个线程直接可见，但不能保证其原子性操作
     * 也就是说，一个线程操作一个变量后，其他线程对该变量的值同步
     *
     * 运行main方法后，同时另一个线程运行run方法之后，主线程将flag设置为false，但是另一个线程并未结束run方法，也就是说另一个运行的线程的flag还是false。
     *
     * 为解决这种：只需要在加上volatile关键字修饰即可
     * 原因：
     *  在虚拟机中线程执行的时候，有一块独享到线程工作内存，会在运行时将变量等信息加载进去，故不具有可见性，而当用volatile时，当其变量改变时，会强制性的重新加载主内存的变量信息。
     */
    public static void main(String[] args){
TesVolatile tv=new TesVolatile();
tv.start();
        try {
            Thread.sleep(2000);
            tv.setFlag(false);
            System.out.println("flag的值"+tv.flag);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }




}
